package com.tjetc;

import com.tjetc.pojo.A;
import com.tjetc.pojo.B;
import com.tjetc.pojo.Monster;
import com.tjetc.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
// 表示当前类 是Boot应用的启动类
/*
    @Configuration: 表示当前类是配置类
    @ComponentScan：表示注解扫描
        扫描的是该类所在的包及其子包
    @EnableAutoConfiguration：启动自动配置
 */
@SpringBootApplication
public class MyApplication {

    @Autowired
    private B b;

    @RequestMapping("/")
    String home() {
        System.out.println(b);
        return "Hello World!";
    }

    // 测试yaml配置文件
    public static void main(String[] args) {
        ApplicationContext ioc = SpringApplication.run(MyApplication.class, args);
        Monster monster = ioc.getBean(Monster.class);
        System.out.println("monster = " + monster);
    }



    // 测试自动属性注入的功能
    public static void main5(String[] args) {
        ApplicationContext ioc = SpringApplication.run(MyApplication.class, args);
//        B b = ioc.getBean("b", B.class);
//        System.out.println(b);
    }


    // 测试配置类注入IOC
    public static void main4(String[] args) {
        ApplicationContext ioc = SpringApplication.run(MyApplication.class, args);
        User user = ioc.getBean("user", User.class);
        User user1 = ioc.getBean("user", User.class);
        System.out.println(user == user1);
    }




    // 修改默认配置
    public static void main3(String[] args) {
        SpringApplication.run(MyApplication.class, args);
        // 读取配置文件的流程
        // 1. 在配置文件中填写对应的属性值
        // 2. 通过这个属性可以找到对应的XXXProperties对应的配置文件
        // 该类中的@ConfigurationProperties("spring.datasource") 中的参数会指明你要在配置文件中找到前缀为什么的属性值
        // 3. XXXProperties的配置文件对应会有一个XXXAutoConfiguration的类
        // 该类中的@EnableConfigurationProperties(DataSourceProperties.class)
        // 加上该注解后会自动将配置类中的属性放到实体对象中 并将创建好的bean注入到IOC中
    }

    // 查看当前IOC中的有哪些bean
    public static void main2(String[] args) {
        ApplicationContext ioc = SpringApplication.run(MyApplication.class, args);
        String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
        for (String definitionName : beanDefinitionNames) {
            System.out.println(definitionName);
        }
    }


    public static void main1(String[] args) {
        // 1.指明该Boot项目的启动类是哪个类
        // 2.Boot的启动参数
        // 3.场景：不同的配置（test，dev，prod）
        SpringApplication.run(MyApplication.class, args);
    }

}
